﻿using System;

namespace memo
{
    /// <summary>
    /// Videóanyagokat reprezentáló osztály.
    /// </summary>
    [Serializable]
    public class VideoFile
    {
        /// <summary>
        /// Videó fájl formátumát megadó enum.
        /// </summary>
        public enum VideoFormat { MP4, AVI, MPG, MKV };

        #region Class getter and setter.
        /// <summary>
        /// Visszaadja/beállítja a fájl elérési útvonalát. Nem lehet null.
        /// </summary>
        public string FilePath
        {
            get
            {
                return myFilePath;
            }
            set
            {
                if (value != null)
                {
                    myFilePath = value;
                }
            }
        }

        /// <summary>
        /// Visszaadja/beállítja a fájl formátumát. Nem lehet null.
        /// </summary>
        public VideoFormat Format { get; set; }
        #endregion

        #region Definition of the class' constructors.
        /// <summary>
        /// Konstruktor az osztály használatához.
        /// </summary>
        /// <param name="path">A videó fájl elérési útvonala.</param>
        /// <param name="format">A videó fájl formátuma.</param>
        /// <exception cref="System.ArgumentNullException">A fájl elérési útvonala üres vagy csak whitespace karaktereket tartalmaz.</exception>
        public VideoFile(string path, VideoFormat format)
        {
            if (!string.IsNullOrWhiteSpace(path))
            {
                this.FilePath = path;
            }
            else
            {
                throw new ArgumentNullException("Parameter cannot be null or empty: ", "path");
            }
            this.Format = format;
        }
        #endregion

        #region Object class overwritten methods.
        /// <summary>
        /// Az aktuális objektummal összehasonlítja a paraméterkénbt megadott objektumot.
        /// </summary>
        /// <param name="obj">Az összehasonlítanó ojbektum.</param>
        /// <returns>Igazat ad vissza ha a két objektum megegyezik.</returns>
        public override bool Equals(object obj)
        {
            bool equal = false;
            VideoFile other = obj as VideoFile;
            if ((other != null)
                && (this.GetType() == other.GetType()))
            {
                if ((this.GetHashCode() == other.GetHashCode())
                    && (this.FilePath == other.FilePath)
                    && (this.Format == other.Format))
                {
                    equal = true;
                }
            }
            return equal;
        }

        /// <summary>
        /// Az objektum hash kódját adja vissza.
        /// </summary>
        /// <returns>Az objektum hash kódja intként.</returns>
        public override int GetHashCode()
        {
            int hash = 0;
            hash += FilePath.GetHashCode();// note: FilePath can't be null, so no checking is needed.
            hash += Format.GetHashCode();
            return hash;
        }
        #endregion

        /// <summary>
        /// A fájl elérési útvonala.
        /// </summary>
        private string myFilePath;
    }
}